/**
 * 权限管理下的用户管理模块
 */
const db = require('../db/index')
const { Op } = require("sequelize")
const bcrypt = require("bcryptjs");
const crypto = require('crypto')

//引入用户模型
const initModels = require('../models/init-models')
const User = initModels(db).info_users
const moment = require('moment');
//获取用户信息的函数
exports.getUserInfo = async (req,res) => {
    //获取传入的参数
    const { username, page, limit } = req.query
    try{
        await db.sync()
        let { count, rows } = await User.findAndCountAll({
            attributes: ['id', 'createTime', 'updateTime', 'username', 'nickname', 'email','roleName','roles'],
            //如果有查询条件则加入查询条件，如果没有则查询全部数据
            where: username !== undefined && username !== '' ? {
                username: { [Op.substring]: username }
            } : undefined,
            offset: (page - 1)*limit,
            limit: limit*1,
            order: [
                ['createTime','DESC']
            ]
        })
        res.pageSend('查询成功！',0,rows,count,limit,page)
    }catch (error){
        res.cc(error)
    }
}
//添加用户
exports.addUser = async (req,res) => {
    //接收表单数据
    const userinfo = req.body
    try{
        await db.sync()
        //sql语句查询用户名是否被占用
        let result = await User.findAll({
            where: { username: userinfo.username },
        })
        if(result.length >= 1) return res.cc('用户名被占用，请更换其他用户名！')
        //加密用户密码
        userinfo.password = bcrypt.hashSync(userinfo.password, 10)
        //生成id
        const id = crypto.randomUUID()
        //生成时间
        const createTime = moment().format('YYYY-MM-DD HH:mm:ss')
        const updateTime = moment().format('YYYY-MM-DD HH:mm:ss')
        let addResult = await User.create({
            id,
            createTime,
            updateTime,
            username: userinfo.username,
            password: userinfo.password,
            nickname: userinfo.nickname
        })
        if(addResult === null){
            return res.cc('添加用户失败，请稍后再试！')
        }
        res.cc('添加成功！',0)
    } catch (error) {
        res.cc(error)
    }
}
//修改用户
exports.updateUser = async (req,res) => {
    //接收表单数据
    const userinfo = req.body
    try{
        await db.sync()
        //sql语句查询用户名是否被占用
        let result = await User.findAll({
            where: {
                username: userinfo.username,
                id: {
                    // [Op.ne]表示不等于
                    [Op.ne]: userinfo.id
                }
            },
        })
        if(result.length >= 1) return res.cc('用户名被占用，请更换其他用户名！')
        //生成时间
        const updateTime = moment().format('YYYY-MM-DD HH:mm:ss')
        let addResult = await User.update({
            username: userinfo.username,
            nickname: userinfo.nickname,
            updateTime}, {
            where: {
                id: userinfo.id
            }
        })
        if(addResult === null){
            return res.cc('修改用户失败，请稍后再试！')
        }
        res.cc('修改成功！',0)
    } catch (error) {
        res.cc(error)
    }
}
//获取当前用户已有的角色
exports.getUserRoles = async (req,res) => {
    const userId = req.query.id
    try{
        await db.sync()
        const result = await User.findOne({
            attributes: ['roles'],
            where: {
                id: userId
            }
        })
        res.dataSend('查询成功！',0,result)
    }catch (error){
        res.cc(error)
    }
}
//给用户分配角色
exports.updateUserRole = async (req,res) => {
    const { id, roles, roleName } = req.body
    try {
        await db.sync()
        //更新时间
        const updateTime = moment().format('YYYY-MM-DD HH:mm:ss')
        const result = await User.update({roles, roleName, updateTime},{
            where: {
                id: id
            }
        })
        if(result === null){
            return res.cc('分配角色失败，请稍后再试！')
        }
        res.cc('分配成功！',0)
    }catch (error){
        res.cc(error)
    }
}
//删除用户
exports.deleteUser = async (req,res) => {
    const userIds = req.body
    try {
        await db.sync()
        const result = await User.destroy({
            where:{
                id: {
                    [Op.in]: userIds
                }
            }
        })
        if(result === null){
            return res.cc('删除用户失败，请稍后再试！')
        }
        res.cc('删除成功！',0)
    }catch (error){
        res.cc(error)
    }
}
